from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QSplitter, QTreeView, QFileSystemModel, QMessageBox, QPushButton
from PyQt5.QtCore import Qt, QDir, pyqtSignal, QTimer
from PyQt5.QtGui import QFont, QIcon
import os

class FileExplorer(QWidget):
    # 信号定义
    file_double_clicked = pyqtSignal(str)  # 文件双击信号
    
    def __init__(self, parent=None):
        super().__init__(parent)
        self.visible = True  # 默认可见
        # 设置默认项目根目录 - 使用绝对路径
        current_dir = os.path.dirname(os.path.abspath(__file__))
        self.current_folder = os.path.abspath(os.path.join(current_dir, ".."))
        self.folders_expanded = True  # 跟踪文件夹展开状态
        self.setup_ui()
    
    def setup_ui(self):
        """设置文件资源管理器界面"""
        # 主布局
        main_layout = QVBoxLayout(self)
        main_layout.setContentsMargins(0, 0, 0, 0)
        main_layout.setSpacing(0)
        
        # 标题栏
        title_bar = QWidget()
        title_bar.setFixedHeight(30)
        title_layout = QHBoxLayout(title_bar)
        title_layout.setContentsMargins(10, 0, 10, 0)
        
        # 展开/收缩按钮
        self.toggle_button = QPushButton()
        self.toggle_button.setFixedSize(20, 20)
        self.toggle_button.setIcon(QIcon("resources/icons/branch_open.svg"))
        self.toggle_button.setFlat(True)
        self.toggle_button.clicked.connect(self.toggle_folder_expansion)
        title_layout.addWidget(self.toggle_button)
        
        # 项目名称标签
        self.title_label = QLabel("")
        title_font = QFont()
        title_font.setBold(True)
        self.title_label.setFont(title_font)
        title_layout.addWidget(self.title_label)
        
        # 初始化项目名称
        self.update_project_name()
        title_layout.addStretch()
        
        main_layout.addWidget(title_bar)
        
        # 文件树视图
        self.tree_view = QTreeView()
        self.model = QFileSystemModel()
        
        # 设置根目录为当前工作目录，使用self.current_folder
        self.model.setRootPath(self.current_folder)
        
        self.tree_view.setModel(self.model)
        self.tree_view.setRootIndex(self.model.index(self.current_folder))
        
        # 隐藏不需要的列
        self.tree_view.setHeaderHidden(True)
        self.tree_view.hideColumn(1)  # 隐藏大小列
        self.tree_view.hideColumn(2)  # 隐藏类型列
        self.tree_view.hideColumn(3)  # 隐藏修改时间列
        
        main_layout.addWidget(self.tree_view)
        
        # 连接文件双击事件
        self.tree_view.doubleClicked.connect(self.on_file_double_clicked)
        
        # 连接单击事件，用于显示文件信息但不打开文件
        self.tree_view.clicked.connect(self.on_file_clicked)
        
        # 不设置硬编码样式，由主题管理器统一管理
    
    def on_file_double_clicked(self, index):
        """文件双击事件"""
        file_path = self.model.filePath(index)
        
        # 检查文件类型并打开文件
        self.check_file_type_and_open(file_path)
    
    def check_file_type_and_open(self, file_path):
        """检查文件类型并打开文件"""
        if not file_path or not os.path.isfile(file_path):
            return
        
        # 定义支持的文本文件扩展名
        text_extensions = ['.txt', '.py', '.c', '.cpp', '.h', '.java', '.html', '.css', '.js' , '.ts', '.json', '.xml', ".ini",
                          ".log", ".text", ".svg", ".mtl", ".obj", ".ps1", ".bat", ".cmd",".xml",".md","go",".sh",".yaml",".yml",
                          ".spec",".cfg",".conf",'.class','php','.sql','.properties','','.svg','.class']
        
        if os.path.splitext(file_path)[1].lower() in text_extensions:
            # 如果是支持的文本文件，发送双击信号打开
            self.file_double_clicked.emit(file_path)
        else:
            # 如果不支持的文件类型，显示提示信息（自动关闭）
            self.show_auto_close_message(file_path)
    
    def on_file_clicked(self, index):
        """文件单击事件 - 仅用于选择文件，不打开文件"""
        # 单击事件只用于选择文件，不触发打开操作
        pass
    
    def show_auto_close_message(self, file_path):
        """显示自动关闭的提示信息"""
        msg_box = QMessageBox(self)
        msg_box.setWindowTitle("提示")
        msg_box.setText(f"不支持打开该类型的文件: {os.path.basename(file_path)}")
        msg_box.setIcon(QMessageBox.Information)
        
        # 设置定时器，500毫秒后自动关闭
        timer = QTimer(msg_box)
        timer.setSingleShot(True)
        timer.timeout.connect(msg_box.close)
        timer.start(500)  # 500毫秒 = 0.5秒
        
        msg_box.exec_()
    
    def show_auto_close_message(self, file_path):
        """显示自动关闭的提示信息"""
        msg_box = QMessageBox(self)
        msg_box.setWindowTitle("提示")
        msg_box.setText(f"不支持打开该类型的文件: {os.path.basename(file_path)}")
        msg_box.setIcon(QMessageBox.Information)
        
        # 设置定时器
        timer = QTimer(msg_box)
        timer.setSingleShot(True)
        timer.timeout.connect(msg_box.close)
        timer.start(200)  
        
        msg_box.exec_()
    
    def update_project_name(self):
        """更新项目名称显示"""
        if self.current_folder:
            # 如果当前有选中的文件夹，直接使用其名称
            project_name = os.path.basename(self.current_folder)
        else:
            # 如果没有选中文件夹，尝试从全局搜索窗口获取项目路径
            project_name = self.get_project_name_from_global_search()
            
            # 如果全局搜索也没有项目信息，使用默认项目名称
            if not project_name:
                current_dir = os.path.dirname(os.path.abspath(__file__))
                root_path = os.path.join(current_dir, "..")
                project_name = os.path.basename(os.path.abspath(root_path))
        
        self.title_label.setText(project_name)
    
    def get_project_name_from_global_search(self):
        """从全局搜索窗口获取项目名称"""
        try:
            # 尝试获取主窗口的全局搜索窗口实例
            main_window = self.parent()
            while main_window and not hasattr(main_window, 'search_window'):
                main_window = main_window.parent()
            
            if main_window and hasattr(main_window, 'search_window') and main_window.search_window:
                # 从全局搜索窗口获取项目路径
                search_window = main_window.search_window
                if hasattr(search_window, 'root_directory') and search_window.root_directory:
                    return os.path.basename(search_window.root_directory)
        except Exception as e:
            print(f"获取全局搜索项目名称失败: {e}")
        
        return None
    
    def load_folder(self, folder_path):
        """加载文件夹"""
        if os.path.isdir(folder_path):
            self.current_folder = folder_path
            self.model.setRootPath(folder_path)
            self.tree_view.setRootIndex(self.model.index(folder_path))
            # 更新项目名称显示
            self.update_project_name()
    
    def clear(self):
        """清除资源管理器内容"""
        # 恢复到默认目录 - 使用绝对路径
        current_dir = os.path.dirname(os.path.abspath(__file__))
        self.current_folder = os.path.abspath(os.path.join(current_dir, ".."))
        self.model.setRootPath(self.current_folder)
        self.tree_view.setRootIndex(self.model.index(self.current_folder))
        # 更新项目名称显示
        self.update_project_name()
    
    def toggle_visibility(self, visible):
        """切换资源管理器可见性"""
        self.setVisible(visible)

    def is_visible(self):
        """返回当前可见性状态"""
        return self.isVisible()
    
    def toggle_folder_expansion(self):
        """切换所有文件夹的展开/收缩状态"""
        if self.folders_expanded:
            # 如果当前是展开状态，则收缩所有文件夹
            self.tree_view.collapseAll()
            self.toggle_button.setIcon(QIcon("resources/icons/branch_closed.svg"))
            self.folders_expanded = False
        else:
            # 如果当前是收缩状态，则展开所有文件夹
            self.tree_view.expandAll()
            self.toggle_button.setIcon(QIcon("resources/icons/branch_open.svg"))
            self.folders_expanded = True